package com.mall.service.impl;

import com.mall.common.Constant;
import com.mall.exception.MallException;
import com.mall.exception.MallExceptionEnum;
import com.mall.mapper.CartMapper;
import com.mall.mapper.ProductMapper;
import com.mall.model.po.Cart;
import com.mall.model.po.CartExample;
import com.mall.model.po.Product;
import com.mall.model.vo.CartVo;
import com.mall.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.smartcardio.CardTerminal;
import java.util.List;

@Service
public class CartServiceImpl implements CartService {
    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private ProductMapper productMapper;
    @Override
    public List<CartVo> addCart(Integer userId, Integer productId, Integer count) {

//        校验商品是否合法
        validProduct(productId,count);
//        通过userId查询购物车内有没有该商品id 有则修改，没有则添加
//        获取某一个特定的商品项
        Cart cart =cartMapper.selectByProductIdAndUserId(userId,productId);
//        判断购物车里没有该商品
        if (cart==null){
//            往购物车里添加 产品、用户、数量、是否选中
            Cart addCart = new Cart();
            addCart.setProductId(productId);
            addCart.setQuantity(count);
            addCart.setUserId(userId);
            addCart.setSelected(Constant.CartSelected.SELECTED);
            cartMapper.insertSelective(addCart);
        }else{
//            修改数量
            cart.setQuantity(cart.getQuantity()+count);
//            传入待修改的对象
            cartMapper.updateByPrimaryKeySelective(cart);
        }
        //查询当前用户的购物车列表并返回
        return list(userId);
    }

    //    校验商品
private void validProduct(Integer productId, Integer count){
//        先查看此商品是否存在
    Product product = productMapper.selectByPrimaryKey(productId);
//    判断商品是否存在且在上架状态
    if (product==null||product.getStatus()==Constant.SellStatus.NOT_SELL){
        throw new MallException(MallExceptionEnum.NOT_SELL_STATUS);
    }
//    判断用户选择的数量是否大于库存的数量
    if (product.getStock()<count){
        throw new MallException(MallExceptionEnum.NEED_STOCK);
    }
}
    @Override
    //查询购物车列表
    public List<CartVo> list(Integer userId) {
        List<CartVo> cartVoList = cartMapper.selectCartsByUserId(userId);
        for (CartVo cartVo: cartVoList){
//            设置小计
            cartVo.setTotalPrice(cartVo.getPrice()*cartVo.getQuantity());
        }
        return cartVoList;
    }

    @Override
    public List<CartVo> updateCart(Integer userId, Integer productId, Integer count) {
//        获取对应修改商品的信息
        Cart cart = cartMapper.selectByProductIdAndUserId(userId, productId);
        if(cart==null){
            throw new MallException(MallExceptionEnum.UPDATE_FAILED);
        }
//        修改商品信息
        cart.setQuantity(count);
        cart.setSelected(Constant.CartSelected.SELECTED);
//        执行修改操作
        int c=cartMapper.updateByPrimaryKeySelective(cart);
            if (c==0){
                throw  new MallException(MallExceptionEnum.UPDATE_FAILED);
            }
        return list(userId);
    }

    @Override
    public List<CartVo> deleteCart(Integer userId, Integer productId) {
//        获取对应删除的信息
        Cart cart = cartMapper.selectByProductIdAndUserId(userId,productId);
//        如果购物车为空
        if(cart==null){
            throw new MallException(MallExceptionEnum.DELETE_FAILED);
        }
//        判断userId与productId是否相等
        CartExample example = new CartExample();
        example.createCriteria().andUserIdEqualTo(userId).andProductIdEqualTo(productId);
//        购物车删除操作
        cartMapper.deleteByExample(example);
        return list(userId);
    }

    @Override
    public List<CartVo> select(Integer userId, Integer productId, Integer selected) {
            Cart cart = cartMapper.selectByProductIdAndUserId(userId,productId);
            if(cart==null){
                throw new MallException(MallExceptionEnum.NOT_EXIST_PRODUCT);
            }
            cartMapper.updateSelectStatus(userId,productId,selected);
            return list(userId);

    }

    @Override
    public List<CartVo> selectAll(Integer userId, Integer selected) {
        cartMapper.updateSelectStatus(userId,null,selected);
        return list(userId);
    }
}
